---
title: 使用 DDL 创建数据库&数据表
description: DDL 用来定于数据库和数据表的结构
---

## 基础语法

DDL 是 SQL 的核心部分， 用来定于数据库和数据表的结构。

常用的功能是增、删、改，分别对应的命令是 CREATE、DROP、ALTER。在执行 DDL 的时候，无需 COMMIT 即可完成执行。
:::tip
COMMIT 用于提交事务。
:::

### 定义数据库
```sql
CREATE DATABASE nba; // 创建一个名为nba的数据库
DROP DATABASE nba; // 删除一个名为nba的数据库
```
### 定义数据表
```sql
CREATE TABLE [table_name](字段名 数据类型，......)
```
比如创建一个球员表，表名为 player，里面有两个字段，一个是 player_id，它是 int 类型，另一个 player_name 字段是varchar(255)类型。这两个字段都不为空，且 player_id 是递增的。

那么创建表的 SQL 可以写为：

```sql
CREATE TABLE player  (
  player_id int(11) NOT NULL AUTO_INCREMENT,
  player_name varchar(255) NOT NULL
);
```
需要注意的是，语句最后以分号（;）作为结束符，最后一个字段的定义结束后没有逗号。

数据类型中 int(11) 代表整数类型，显示长度为 11 位，括号中的参数 11 代表的是最大有效显示长度，与类型包含的数值范围大小无关。varchar(255)代表的是最大长度为 255 的可变字符串类型。NOT NULL表明整个字段不能是空值，是一种数据约束。AUTO_INCREMENT代表主键自动增长。

假如还是针对 player 这张表，我们想设计以下的字段：

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202411262247358.png"/>

其中 player_id 是数据表 player 的主键，且自动增长，也就是 player_id 会从 1 开始，然后每次加 1。player_id、team_id、player_name 这三个字段均不为空，height 字段可以为空。

```sql
DROP TABLE IF EXISTS `player`;
CREATE TABLE `player`  (
  `player_id` int(11) NOT NULL AUTO_INCREMENT,
  `team_id` int(11) NOT NULL,
  `player_name` varchar(255) NOT NULL,
  `height` float(3, 2) NULL DEFAULT 0.00,
  PRIMARY KEY (`player_id`) ,
  UNIQUE INDEX `player_name`(`player_name`)
) ENGINE = InnoDB CHARACTER SET = utf8 ;
```
首先先删除 player 表（如果数据库中存在该表的话），然后再创建 player 表，里面的数据表和字段都使用了反引号，这是为了避免它们的名称与 MySQL 保留字段相同，对数据表和字段名称都加上了反引号。


其中 player_name 字段的字符编码是 utf8，player_id 设置为了主键，因此在 DDL 中使用PRIMARY KEY进行规定。

整个数据表的存储规则采用 InnoDB。

## 修改表结构


```sql title='添加字段，比如我在数据表中添加一个 age 字段，类型为int(11)'
ALTER TABLE player ADD (age int(11));
```

```sql title='修改字段名，将 age 字段改成player_age'
ALTER TABLE player RENAME COLUMN age to player_age
```

```sql title='修改字段的数据类型，将player_age的数据类型设置为float(3,1)'
ALTER TABLE player MODIFY (player_age float(3,1));
```

```sql title='删除字段, 删除刚才添加的player_age字段'
ALTER TABLE player DROP COLUMN player_age;
```

## 数据表的常见约束
* 实体完整性约束:即 主键约束，主键的值不能为空，也不能重复。
* 参照完整性约束：即外键约束，外键必须是其它表中已经存在的主键的值，或者为空。
* 用户自定义完整性:自定义表达式约束。
    * 唯一性约束，通过添加唯一索引实现
    * NOT NULL 约束：对字段设置 NOT NULL，即表明该字段不应为空，应该有取值。
    * DEFAULT： 表示字段的默认值，在插入数据的时候，如果这个字段没有设置，就设置为默认值
    * CHECK 约束，指定一个范围，比如`CHECK(height>=0 AND height<3)`，表示身高必须 $\geq$ 0 且 $\lt$ 3